/**
 * 2
 *  
 * @Author : roryrywang
 * @DateTime : 24-9-6 下午7:36
 */

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

//class Solution {
//public:
//    /**
//     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
//     *
//     *
//     * @param N int整型
//     * @return int整型vector
//     */
//
//    int findIdx(vector<int> &nums, int l, int r, int x) {
//        while (l < r) {
//            int mid = (l + r + 1) >> 1;
//            if (nums[mid] <= x) l = mid;
//            else r = mid - 1;
//        }
//        return l;
//    }
//
//    vector<int> MinimumK(int N) {
//        vector<int> nums(1);
//        for (int i = 1; i * i * i <= N; ++i) {
//            nums.push_back(i * i * i);
//        }
//
//        vector<int> res(nums.size() + 100);
//
//        for (int i = nums.size() - 1; i >= 1; --i) {
//            int tmp = N;
//            int r = i;
//            vector<int> ans;
//            while (tmp >= 0) {
//                if (tmp == 0) break;
//                int idx = findIdx(nums, 1, r, tmp);
//                int k = tmp / nums[idx];
//                for (int j = 0; j < k; ++j) {
//                    ans.push_back(idx);
//                    if (ans.size() > res.size()) break;
//                }
//                tmp -= k * nums[idx];
//                r = idx - 1;
//            }
//            if (ans.size() < res.size()) res = ans;
//        }
//        return res;
//    }
//};

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param N int整型
     * @return int整型vector
     */

    vector<int> MinimumK(int N) {
        vector<int> nums(1);
        for (int i = 1; i * i * i <= N; ++i) {
            nums.push_back(i * i * i);
        }

        vector<int> res(nums.size() + 100);

        for (int i = nums.size() - 1; i >= 1; --i) {
            int tmp = N;
            int r = i;
            vector<int> ans;
            while (tmp >= 0) {
                if (tmp == 0) break;
                while (tmp < nums[r]) r--;
                int k = tmp / nums[r];
                for (int j = 0; j < k; ++j) {
                    ans.push_back(r);
                    if (ans.size() > res.size()) break;
                }
                tmp -= k * nums[r];
                r--;
            }
            if (ans.size() < res.size()) res = ans;
        }
        return res;
    }
};

int main() {
    Solution sl;
    vector<int> res = sl.MinimumK(42);
    for (int x: res) {
        cout << x << " ";
    }
    return 0;
}